package main
import (
	"fmt"
	"runtime"
	"time"
)
	
func main() {
	// gosched()
	// goexit()
	goMaxprocs()
}	

func gosched(){
	go func (s string){
		for i := 0; i < 2; i++ {
			fmt.Println(s)
		}
	}("world")
	
	// 主协程
	for i := 0; i < 2; i++ {
		// 切一下，再次分配任务
		runtime.Gosched()
		fmt.Println("hello")
	}
}

func goexit(){
	go func() {
        defer fmt.Println("A.defer")
        func() {
            defer fmt.Println("B.defer")
            // 结束协程
            runtime.Goexit()
            defer fmt.Println("C.defer")
            fmt.Println("B")
        }()
        fmt.Println("A")
    }()
	
	for {
    }
}

//Go运行时的调度器是使用GoMaxprocs参数来确定需要使用多少个OS线程来同时执行Go代码。
//默认值是机器上的CPU核心数。例如在一个8核心的机器上，调度器会把Go代码同时调度到8个OS线程上
//GOMAXPROCS是m:n调度中的n.
func goMaxprocs() {
	runtime.GOMAXPROCS(2)
	go aFunctionAction()
	go bFunctionAction()
	time.Sleep(2*time.Second)
	// fmt.Println("结束")
}

func aFunctionAction(){
	for i := 0; i < 10; i++ {
		fmt.Println("A:",i)
	}
}

func bFunctionAction()  {
	for i := 0; i < 10; i++ {
		fmt.Println("B:",i)
	}
}